{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "import os\n",
    "from collections import defaultdict\n",
    "\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "from IPython.display import display\n",
    "\n",
    "plt.rcParams[\"font.family\"] = \"Times New Roman\"\n",
    "\n",
    "matplotlib.rcParams['pdf.fonttype'] = 42\n",
    "matplotlib.rcParams['ps.fonttype'] = 42\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>exp_name</th>\n",
       "      <th>exp_class</th>\n",
       "      <th>task</th>\n",
       "      <th>svhn</th>\n",
       "      <th>stanford_cars</th>\n",
       "      <th>resisc45</th>\n",
       "      <th>eurosat</th>\n",
       "      <th>gtsrb</th>\n",
       "      <th>mnist</th>\n",
       "      <th>dtd</th>\n",
       "      <th>sun397</th>\n",
       "      <th>average</th>\n",
       "      <th>task_accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>clip-vit-base-patch32_sun397</td>\n",
       "      <td>Finetuned</td>\n",
       "      <td>sun397</td>\n",
       "      <td>0.282691</td>\n",
       "      <td>0.469593</td>\n",
       "      <td>0.543175</td>\n",
       "      <td>0.464815</td>\n",
       "      <td>0.264291</td>\n",
       "      <td>0.4433</td>\n",
       "      <td>0.416489</td>\n",
       "      <td>0.749673</td>\n",
       "      <td>45.425332</td>\n",
       "      <td>0.749673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>projection_merging_zone1_sun397</td>\n",
       "      <td>Space I</td>\n",
       "      <td>sun397</td>\n",
       "      <td>0.330593</td>\n",
       "      <td>0.555030</td>\n",
       "      <td>0.594762</td>\n",
       "      <td>0.584815</td>\n",
       "      <td>0.274426</td>\n",
       "      <td>0.4899</td>\n",
       "      <td>0.409574</td>\n",
       "      <td>0.638690</td>\n",
       "      <td>48.472386</td>\n",
       "      <td>0.638690</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>projection_merging_zone2_sun397</td>\n",
       "      <td>Space II</td>\n",
       "      <td>sun397</td>\n",
       "      <td>0.327097</td>\n",
       "      <td>0.553662</td>\n",
       "      <td>0.592540</td>\n",
       "      <td>0.580000</td>\n",
       "      <td>0.294695</td>\n",
       "      <td>0.4793</td>\n",
       "      <td>0.419149</td>\n",
       "      <td>0.679950</td>\n",
       "      <td>49.079916</td>\n",
       "      <td>0.679950</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>projection_merging_zone23_sun397</td>\n",
       "      <td>Space II &amp; III</td>\n",
       "      <td>sun397</td>\n",
       "      <td>0.316994</td>\n",
       "      <td>0.544335</td>\n",
       "      <td>0.590476</td>\n",
       "      <td>0.571481</td>\n",
       "      <td>0.306097</td>\n",
       "      <td>0.4611</td>\n",
       "      <td>0.428723</td>\n",
       "      <td>0.722872</td>\n",
       "      <td>49.275987</td>\n",
       "      <td>0.722872</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>clip-vit-base-patch32_stanford-cars</td>\n",
       "      <td>Finetuned</td>\n",
       "      <td>stanford-cars</td>\n",
       "      <td>0.302090</td>\n",
       "      <td>0.782987</td>\n",
       "      <td>0.508730</td>\n",
       "      <td>0.383704</td>\n",
       "      <td>0.306017</td>\n",
       "      <td>0.4971</td>\n",
       "      <td>0.418085</td>\n",
       "      <td>0.565995</td>\n",
       "      <td>47.058854</td>\n",
       "      <td>0.782987</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>projection_merging_zone1_stanford-cars</td>\n",
       "      <td>Space I</td>\n",
       "      <td>stanford-cars</td>\n",
       "      <td>0.326483</td>\n",
       "      <td>0.595946</td>\n",
       "      <td>0.593333</td>\n",
       "      <td>0.540370</td>\n",
       "      <td>0.285907</td>\n",
       "      <td>0.5070</td>\n",
       "      <td>0.411170</td>\n",
       "      <td>0.619446</td>\n",
       "      <td>48.495686</td>\n",
       "      <td>0.595946</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>projection_merging_zone2_stanford-cars</td>\n",
       "      <td>Space II</td>\n",
       "      <td>stanford-cars</td>\n",
       "      <td>0.312923</td>\n",
       "      <td>0.660863</td>\n",
       "      <td>0.589841</td>\n",
       "      <td>0.536296</td>\n",
       "      <td>0.291528</td>\n",
       "      <td>0.4970</td>\n",
       "      <td>0.414362</td>\n",
       "      <td>0.615063</td>\n",
       "      <td>48.973450</td>\n",
       "      <td>0.660863</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>projection_merging_zone23_stanford-cars</td>\n",
       "      <td>Space II &amp; III</td>\n",
       "      <td>stanford-cars</td>\n",
       "      <td>0.313422</td>\n",
       "      <td>0.738341</td>\n",
       "      <td>0.577143</td>\n",
       "      <td>0.525185</td>\n",
       "      <td>0.303880</td>\n",
       "      <td>0.4853</td>\n",
       "      <td>0.421809</td>\n",
       "      <td>0.608615</td>\n",
       "      <td>49.671171</td>\n",
       "      <td>0.738341</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>clip-vit-base-patch32_resisc45</td>\n",
       "      <td>Finetuned</td>\n",
       "      <td>resisc45</td>\n",
       "      <td>0.238860</td>\n",
       "      <td>0.472205</td>\n",
       "      <td>0.951905</td>\n",
       "      <td>0.568889</td>\n",
       "      <td>0.242518</td>\n",
       "      <td>0.3968</td>\n",
       "      <td>0.358511</td>\n",
       "      <td>0.519950</td>\n",
       "      <td>46.870457</td>\n",
       "      <td>0.951905</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>projection_merging_zone1_resisc45</td>\n",
       "      <td>Space I</td>\n",
       "      <td>resisc45</td>\n",
       "      <td>0.319760</td>\n",
       "      <td>0.554160</td>\n",
       "      <td>0.655873</td>\n",
       "      <td>0.592593</td>\n",
       "      <td>0.284640</td>\n",
       "      <td>0.4772</td>\n",
       "      <td>0.406915</td>\n",
       "      <td>0.619144</td>\n",
       "      <td>48.878551</td>\n",
       "      <td>0.655873</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>projection_merging_zone2_resisc45</td>\n",
       "      <td>Space II</td>\n",
       "      <td>resisc45</td>\n",
       "      <td>0.319338</td>\n",
       "      <td>0.554409</td>\n",
       "      <td>0.796825</td>\n",
       "      <td>0.604444</td>\n",
       "      <td>0.270784</td>\n",
       "      <td>0.4780</td>\n",
       "      <td>0.413298</td>\n",
       "      <td>0.615617</td>\n",
       "      <td>50.658939</td>\n",
       "      <td>0.796825</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>projection_merging_zone23_resisc45</td>\n",
       "      <td>Space II &amp; III</td>\n",
       "      <td>resisc45</td>\n",
       "      <td>0.309542</td>\n",
       "      <td>0.543838</td>\n",
       "      <td>0.914603</td>\n",
       "      <td>0.621852</td>\n",
       "      <td>0.274822</td>\n",
       "      <td>0.4750</td>\n",
       "      <td>0.408511</td>\n",
       "      <td>0.607456</td>\n",
       "      <td>51.945292</td>\n",
       "      <td>0.914603</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>clip-vit-base-patch32_eurosat</td>\n",
       "      <td>Finetuned</td>\n",
       "      <td>eurosat</td>\n",
       "      <td>0.117548</td>\n",
       "      <td>0.399453</td>\n",
       "      <td>0.335397</td>\n",
       "      <td>0.990370</td>\n",
       "      <td>0.228583</td>\n",
       "      <td>0.3380</td>\n",
       "      <td>0.355319</td>\n",
       "      <td>0.489874</td>\n",
       "      <td>40.681795</td>\n",
       "      <td>0.990370</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>projection_merging_zone1_eurosat</td>\n",
       "      <td>Space I</td>\n",
       "      <td>eurosat</td>\n",
       "      <td>0.317724</td>\n",
       "      <td>0.522572</td>\n",
       "      <td>0.585238</td>\n",
       "      <td>0.734815</td>\n",
       "      <td>0.257007</td>\n",
       "      <td>0.4224</td>\n",
       "      <td>0.414362</td>\n",
       "      <td>0.609874</td>\n",
       "      <td>48.299900</td>\n",
       "      <td>0.734815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>projection_merging_zone2_eurosat</td>\n",
       "      <td>Space II</td>\n",
       "      <td>eurosat</td>\n",
       "      <td>0.321335</td>\n",
       "      <td>0.519587</td>\n",
       "      <td>0.572857</td>\n",
       "      <td>0.927407</td>\n",
       "      <td>0.268171</td>\n",
       "      <td>0.4087</td>\n",
       "      <td>0.404255</td>\n",
       "      <td>0.608514</td>\n",
       "      <td>50.385338</td>\n",
       "      <td>0.927407</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>projection_merging_zone23_eurosat</td>\n",
       "      <td>Space II &amp; III</td>\n",
       "      <td>eurosat</td>\n",
       "      <td>0.299862</td>\n",
       "      <td>0.500933</td>\n",
       "      <td>0.519206</td>\n",
       "      <td>0.975185</td>\n",
       "      <td>0.284165</td>\n",
       "      <td>0.4133</td>\n",
       "      <td>0.406915</td>\n",
       "      <td>0.598992</td>\n",
       "      <td>49.981974</td>\n",
       "      <td>0.975185</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>clip-vit-base-patch32_svhn</td>\n",
       "      <td>Finetuned</td>\n",
       "      <td>svhn</td>\n",
       "      <td>0.972687</td>\n",
       "      <td>0.362890</td>\n",
       "      <td>0.188571</td>\n",
       "      <td>0.098148</td>\n",
       "      <td>0.272922</td>\n",
       "      <td>0.8178</td>\n",
       "      <td>0.232447</td>\n",
       "      <td>0.404937</td>\n",
       "      <td>41.880033</td>\n",
       "      <td>0.972687</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>projection_merging_zone1_svhn</td>\n",
       "      <td>Space I</td>\n",
       "      <td>svhn</td>\n",
       "      <td>0.492586</td>\n",
       "      <td>0.528168</td>\n",
       "      <td>0.560952</td>\n",
       "      <td>0.430000</td>\n",
       "      <td>0.276643</td>\n",
       "      <td>0.4961</td>\n",
       "      <td>0.403723</td>\n",
       "      <td>0.606448</td>\n",
       "      <td>47.432766</td>\n",
       "      <td>0.492586</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>projection_merging_zone2_svhn</td>\n",
       "      <td>Space II</td>\n",
       "      <td>svhn</td>\n",
       "      <td>0.723456</td>\n",
       "      <td>0.529287</td>\n",
       "      <td>0.567619</td>\n",
       "      <td>0.398889</td>\n",
       "      <td>0.264291</td>\n",
       "      <td>0.6046</td>\n",
       "      <td>0.388830</td>\n",
       "      <td>0.603577</td>\n",
       "      <td>51.006863</td>\n",
       "      <td>0.723456</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>projection_merging_zone23_svhn</td>\n",
       "      <td>Space II &amp; III</td>\n",
       "      <td>svhn</td>\n",
       "      <td>0.931008</td>\n",
       "      <td>0.505534</td>\n",
       "      <td>0.532540</td>\n",
       "      <td>0.295926</td>\n",
       "      <td>0.285273</td>\n",
       "      <td>0.7027</td>\n",
       "      <td>0.389894</td>\n",
       "      <td>0.591940</td>\n",
       "      <td>52.935176</td>\n",
       "      <td>0.931008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>clip-vit-base-patch32_gtsrb</td>\n",
       "      <td>Finetuned</td>\n",
       "      <td>gtsrb</td>\n",
       "      <td>0.411570</td>\n",
       "      <td>0.330058</td>\n",
       "      <td>0.206190</td>\n",
       "      <td>0.212963</td>\n",
       "      <td>0.989074</td>\n",
       "      <td>0.3087</td>\n",
       "      <td>0.238830</td>\n",
       "      <td>0.368262</td>\n",
       "      <td>38.320596</td>\n",
       "      <td>0.989074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>projection_merging_zone1_gtsrb</td>\n",
       "      <td>Space I</td>\n",
       "      <td>gtsrb</td>\n",
       "      <td>0.376652</td>\n",
       "      <td>0.513618</td>\n",
       "      <td>0.566825</td>\n",
       "      <td>0.448519</td>\n",
       "      <td>0.384877</td>\n",
       "      <td>0.4807</td>\n",
       "      <td>0.386702</td>\n",
       "      <td>0.602166</td>\n",
       "      <td>47.000738</td>\n",
       "      <td>0.384877</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>projection_merging_zone2_gtsrb</td>\n",
       "      <td>Space II</td>\n",
       "      <td>gtsrb</td>\n",
       "      <td>0.411609</td>\n",
       "      <td>0.521204</td>\n",
       "      <td>0.566667</td>\n",
       "      <td>0.446296</td>\n",
       "      <td>0.674505</td>\n",
       "      <td>0.4659</td>\n",
       "      <td>0.388830</td>\n",
       "      <td>0.597834</td>\n",
       "      <td>50.910554</td>\n",
       "      <td>0.674505</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>projection_merging_zone23_gtsrb</td>\n",
       "      <td>Space II &amp; III</td>\n",
       "      <td>gtsrb</td>\n",
       "      <td>0.478565</td>\n",
       "      <td>0.507026</td>\n",
       "      <td>0.541111</td>\n",
       "      <td>0.417037</td>\n",
       "      <td>0.938163</td>\n",
       "      <td>0.4223</td>\n",
       "      <td>0.378723</td>\n",
       "      <td>0.583073</td>\n",
       "      <td>53.324988</td>\n",
       "      <td>0.938163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>clip-vit-base-patch32_mnist</td>\n",
       "      <td>Finetuned</td>\n",
       "      <td>mnist</td>\n",
       "      <td>0.501498</td>\n",
       "      <td>0.400448</td>\n",
       "      <td>0.313016</td>\n",
       "      <td>0.177407</td>\n",
       "      <td>0.193191</td>\n",
       "      <td>0.9958</td>\n",
       "      <td>0.307447</td>\n",
       "      <td>0.502569</td>\n",
       "      <td>42.392201</td>\n",
       "      <td>0.995800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>projection_merging_zone1_mnist</td>\n",
       "      <td>Space I</td>\n",
       "      <td>mnist</td>\n",
       "      <td>0.390519</td>\n",
       "      <td>0.542470</td>\n",
       "      <td>0.567460</td>\n",
       "      <td>0.434444</td>\n",
       "      <td>0.276643</td>\n",
       "      <td>0.6463</td>\n",
       "      <td>0.401596</td>\n",
       "      <td>0.609169</td>\n",
       "      <td>48.357518</td>\n",
       "      <td>0.646300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>projection_merging_zone2_mnist</td>\n",
       "      <td>Space II</td>\n",
       "      <td>mnist</td>\n",
       "      <td>0.453711</td>\n",
       "      <td>0.543092</td>\n",
       "      <td>0.572381</td>\n",
       "      <td>0.437778</td>\n",
       "      <td>0.278702</td>\n",
       "      <td>0.9341</td>\n",
       "      <td>0.389362</td>\n",
       "      <td>0.604030</td>\n",
       "      <td>52.664433</td>\n",
       "      <td>0.934100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>projection_merging_zone23_mnist</td>\n",
       "      <td>Space II &amp; III</td>\n",
       "      <td>mnist</td>\n",
       "      <td>0.527812</td>\n",
       "      <td>0.535506</td>\n",
       "      <td>0.552063</td>\n",
       "      <td>0.424444</td>\n",
       "      <td>0.293666</td>\n",
       "      <td>0.9903</td>\n",
       "      <td>0.386702</td>\n",
       "      <td>0.592645</td>\n",
       "      <td>53.789227</td>\n",
       "      <td>0.990300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>clip-vit-base-patch32_dtd</td>\n",
       "      <td>Finetuned</td>\n",
       "      <td>dtd</td>\n",
       "      <td>0.289490</td>\n",
       "      <td>0.512623</td>\n",
       "      <td>0.368413</td>\n",
       "      <td>0.250000</td>\n",
       "      <td>0.218290</td>\n",
       "      <td>0.4734</td>\n",
       "      <td>0.797340</td>\n",
       "      <td>0.545743</td>\n",
       "      <td>43.191234</td>\n",
       "      <td>0.797340</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>projection_merging_zone1_dtd</td>\n",
       "      <td>Space I</td>\n",
       "      <td>dtd</td>\n",
       "      <td>0.357253</td>\n",
       "      <td>0.570327</td>\n",
       "      <td>0.587619</td>\n",
       "      <td>0.495185</td>\n",
       "      <td>0.270309</td>\n",
       "      <td>0.5054</td>\n",
       "      <td>0.436170</td>\n",
       "      <td>0.623174</td>\n",
       "      <td>48.067960</td>\n",
       "      <td>0.436170</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>projection_merging_zone2_dtd</td>\n",
       "      <td>Space II</td>\n",
       "      <td>dtd</td>\n",
       "      <td>0.346189</td>\n",
       "      <td>0.566472</td>\n",
       "      <td>0.582540</td>\n",
       "      <td>0.491111</td>\n",
       "      <td>0.273159</td>\n",
       "      <td>0.5174</td>\n",
       "      <td>0.589362</td>\n",
       "      <td>0.618438</td>\n",
       "      <td>49.808389</td>\n",
       "      <td>0.589362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>projection_merging_zone23_dtd</td>\n",
       "      <td>Space II &amp; III</td>\n",
       "      <td>dtd</td>\n",
       "      <td>0.325061</td>\n",
       "      <td>0.563114</td>\n",
       "      <td>0.564286</td>\n",
       "      <td>0.443333</td>\n",
       "      <td>0.260570</td>\n",
       "      <td>0.5401</td>\n",
       "      <td>0.719681</td>\n",
       "      <td>0.612846</td>\n",
       "      <td>50.362398</td>\n",
       "      <td>0.719681</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>clip-vit-base-patch32</td>\n",
       "      <td>Pretrained</td>\n",
       "      <td>pretrained</td>\n",
       "      <td>0.316073</td>\n",
       "      <td>0.597687</td>\n",
       "      <td>0.606508</td>\n",
       "      <td>0.459630</td>\n",
       "      <td>0.324782</td>\n",
       "      <td>0.4825</td>\n",
       "      <td>0.438830</td>\n",
       "      <td>0.631637</td>\n",
       "      <td>48.220578</td>\n",
       "      <td>50.362398</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                   exp_name       exp_class           task  \\\n",
       "0              clip-vit-base-patch32_sun397       Finetuned         sun397   \n",
       "1           projection_merging_zone1_sun397         Space I         sun397   \n",
       "2           projection_merging_zone2_sun397        Space II         sun397   \n",
       "3          projection_merging_zone23_sun397  Space II & III         sun397   \n",
       "4       clip-vit-base-patch32_stanford-cars       Finetuned  stanford-cars   \n",
       "5    projection_merging_zone1_stanford-cars         Space I  stanford-cars   \n",
       "6    projection_merging_zone2_stanford-cars        Space II  stanford-cars   \n",
       "7   projection_merging_zone23_stanford-cars  Space II & III  stanford-cars   \n",
       "8            clip-vit-base-patch32_resisc45       Finetuned       resisc45   \n",
       "9         projection_merging_zone1_resisc45         Space I       resisc45   \n",
       "10        projection_merging_zone2_resisc45        Space II       resisc45   \n",
       "11       projection_merging_zone23_resisc45  Space II & III       resisc45   \n",
       "12            clip-vit-base-patch32_eurosat       Finetuned        eurosat   \n",
       "13         projection_merging_zone1_eurosat         Space I        eurosat   \n",
       "14         projection_merging_zone2_eurosat        Space II        eurosat   \n",
       "15        projection_merging_zone23_eurosat  Space II & III        eurosat   \n",
       "16               clip-vit-base-patch32_svhn       Finetuned           svhn   \n",
       "17            projection_merging_zone1_svhn         Space I           svhn   \n",
       "18            projection_merging_zone2_svhn        Space II           svhn   \n",
       "19           projection_merging_zone23_svhn  Space II & III           svhn   \n",
       "20              clip-vit-base-patch32_gtsrb       Finetuned          gtsrb   \n",
       "21           projection_merging_zone1_gtsrb         Space I          gtsrb   \n",
       "22           projection_merging_zone2_gtsrb        Space II          gtsrb   \n",
       "23          projection_merging_zone23_gtsrb  Space II & III          gtsrb   \n",
       "24              clip-vit-base-patch32_mnist       Finetuned          mnist   \n",
       "25           projection_merging_zone1_mnist         Space I          mnist   \n",
       "26           projection_merging_zone2_mnist        Space II          mnist   \n",
       "27          projection_merging_zone23_mnist  Space II & III          mnist   \n",
       "28                clip-vit-base-patch32_dtd       Finetuned            dtd   \n",
       "29             projection_merging_zone1_dtd         Space I            dtd   \n",
       "30             projection_merging_zone2_dtd        Space II            dtd   \n",
       "31            projection_merging_zone23_dtd  Space II & III            dtd   \n",
       "32                    clip-vit-base-patch32      Pretrained     pretrained   \n",
       "\n",
       "        svhn  stanford_cars  resisc45   eurosat     gtsrb   mnist       dtd  \\\n",
       "0   0.282691       0.469593  0.543175  0.464815  0.264291  0.4433  0.416489   \n",
       "1   0.330593       0.555030  0.594762  0.584815  0.274426  0.4899  0.409574   \n",
       "2   0.327097       0.553662  0.592540  0.580000  0.294695  0.4793  0.419149   \n",
       "3   0.316994       0.544335  0.590476  0.571481  0.306097  0.4611  0.428723   \n",
       "4   0.302090       0.782987  0.508730  0.383704  0.306017  0.4971  0.418085   \n",
       "5   0.326483       0.595946  0.593333  0.540370  0.285907  0.5070  0.411170   \n",
       "6   0.312923       0.660863  0.589841  0.536296  0.291528  0.4970  0.414362   \n",
       "7   0.313422       0.738341  0.577143  0.525185  0.303880  0.4853  0.421809   \n",
       "8   0.238860       0.472205  0.951905  0.568889  0.242518  0.3968  0.358511   \n",
       "9   0.319760       0.554160  0.655873  0.592593  0.284640  0.4772  0.406915   \n",
       "10  0.319338       0.554409  0.796825  0.604444  0.270784  0.4780  0.413298   \n",
       "11  0.309542       0.543838  0.914603  0.621852  0.274822  0.4750  0.408511   \n",
       "12  0.117548       0.399453  0.335397  0.990370  0.228583  0.3380  0.355319   \n",
       "13  0.317724       0.522572  0.585238  0.734815  0.257007  0.4224  0.414362   \n",
       "14  0.321335       0.519587  0.572857  0.927407  0.268171  0.4087  0.404255   \n",
       "15  0.299862       0.500933  0.519206  0.975185  0.284165  0.4133  0.406915   \n",
       "16  0.972687       0.362890  0.188571  0.098148  0.272922  0.8178  0.232447   \n",
       "17  0.492586       0.528168  0.560952  0.430000  0.276643  0.4961  0.403723   \n",
       "18  0.723456       0.529287  0.567619  0.398889  0.264291  0.6046  0.388830   \n",
       "19  0.931008       0.505534  0.532540  0.295926  0.285273  0.7027  0.389894   \n",
       "20  0.411570       0.330058  0.206190  0.212963  0.989074  0.3087  0.238830   \n",
       "21  0.376652       0.513618  0.566825  0.448519  0.384877  0.4807  0.386702   \n",
       "22  0.411609       0.521204  0.566667  0.446296  0.674505  0.4659  0.388830   \n",
       "23  0.478565       0.507026  0.541111  0.417037  0.938163  0.4223  0.378723   \n",
       "24  0.501498       0.400448  0.313016  0.177407  0.193191  0.9958  0.307447   \n",
       "25  0.390519       0.542470  0.567460  0.434444  0.276643  0.6463  0.401596   \n",
       "26  0.453711       0.543092  0.572381  0.437778  0.278702  0.9341  0.389362   \n",
       "27  0.527812       0.535506  0.552063  0.424444  0.293666  0.9903  0.386702   \n",
       "28  0.289490       0.512623  0.368413  0.250000  0.218290  0.4734  0.797340   \n",
       "29  0.357253       0.570327  0.587619  0.495185  0.270309  0.5054  0.436170   \n",
       "30  0.346189       0.566472  0.582540  0.491111  0.273159  0.5174  0.589362   \n",
       "31  0.325061       0.563114  0.564286  0.443333  0.260570  0.5401  0.719681   \n",
       "32  0.316073       0.597687  0.606508  0.459630  0.324782  0.4825  0.438830   \n",
       "\n",
       "      sun397    average  task_accuracy  \n",
       "0   0.749673  45.425332       0.749673  \n",
       "1   0.638690  48.472386       0.638690  \n",
       "2   0.679950  49.079916       0.679950  \n",
       "3   0.722872  49.275987       0.722872  \n",
       "4   0.565995  47.058854       0.782987  \n",
       "5   0.619446  48.495686       0.595946  \n",
       "6   0.615063  48.973450       0.660863  \n",
       "7   0.608615  49.671171       0.738341  \n",
       "8   0.519950  46.870457       0.951905  \n",
       "9   0.619144  48.878551       0.655873  \n",
       "10  0.615617  50.658939       0.796825  \n",
       "11  0.607456  51.945292       0.914603  \n",
       "12  0.489874  40.681795       0.990370  \n",
       "13  0.609874  48.299900       0.734815  \n",
       "14  0.608514  50.385338       0.927407  \n",
       "15  0.598992  49.981974       0.975185  \n",
       "16  0.404937  41.880033       0.972687  \n",
       "17  0.606448  47.432766       0.492586  \n",
       "18  0.603577  51.006863       0.723456  \n",
       "19  0.591940  52.935176       0.931008  \n",
       "20  0.368262  38.320596       0.989074  \n",
       "21  0.602166  47.000738       0.384877  \n",
       "22  0.597834  50.910554       0.674505  \n",
       "23  0.583073  53.324988       0.938163  \n",
       "24  0.502569  42.392201       0.995800  \n",
       "25  0.609169  48.357518       0.646300  \n",
       "26  0.604030  52.664433       0.934100  \n",
       "27  0.592645  53.789227       0.990300  \n",
       "28  0.545743  43.191234       0.797340  \n",
       "29  0.623174  48.067960       0.436170  \n",
       "30  0.618438  49.808389       0.589362  \n",
       "31  0.612846  50.362398       0.719681  \n",
       "32  0.631637  48.220578      50.362398  "
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_dir = \"/workspace/svd_subspace/outputs/ViT-B-32/single-task\"\n",
    "exp_data = defaultdict(list)\n",
    "\n",
    "\n",
    "def _load_data(file_name):\n",
    "    if not os.path.exists(file_name):\n",
    "        print(f\"File {file_name} does not exist\")\n",
    "        return\n",
    "    with open(file_name) as f:\n",
    "        data = json.load(f)\n",
    "    accuracies = {}\n",
    "    for key in data:\n",
    "        if key == \"model_info\":\n",
    "            continue\n",
    "        accuracies[key] = data[key][\"accuracy\"]\n",
    "    average_accuracy = np.mean(list(accuracies.values())) * 100\n",
    "    for key in accuracies:\n",
    "        exp_data[key].append(accuracies[key])\n",
    "    exp_data[\"average\"].append(average_accuracy)\n",
    "\n",
    "\n",
    "for task in [\n",
    "    \"sun397\",\n",
    "    \"stanford-cars\",\n",
    "    \"resisc45\",\n",
    "    \"eurosat\",\n",
    "    \"svhn\",\n",
    "    \"gtsrb\",\n",
    "    \"mnist\",\n",
    "    \"dtd\",\n",
    "]:\n",
    "    for file_name, exp_class in zip(\n",
    "        [\n",
    "            f\"clip-vit-base-patch32_{task}.json\",\n",
    "            f\"projection_merging_zone1_{task}.json\",\n",
    "            f\"projection_merging_zone2_{task}.json\",\n",
    "            f\"projection_merging_zone23_{task}.json\",\n",
    "        ],\n",
    "        [\"Finetuned\", \"Space I\", \"Space II\", \"Space II & III\"],\n",
    "    ):\n",
    "        if not os.path.exists(os.path.join(data_dir, file_name)):\n",
    "            continue\n",
    "        exp_data[\"exp_name\"].append(file_name.split(\".\")[0])\n",
    "        exp_data[\"exp_class\"].append(exp_class)\n",
    "        exp_data[\"task\"].append(task)\n",
    "        file_name = os.path.join(data_dir, file_name)\n",
    "        _load_data(file_name)\n",
    "        exp_data[\"task_accuracy\"].append(exp_data[task.replace(\"-\", \"_\")][-1])\n",
    "\n",
    "file_name = os.path.join(data_dir, \"clip-vit-base-patch32.json\")\n",
    "exp_data[\"exp_name\"].append(\"clip-vit-base-patch32\")\n",
    "exp_data[\"exp_class\"].append(\"Pretrained\")\n",
    "exp_data[\"task\"].append(\"pretrained\")\n",
    "exp_data[\"task_accuracy\"].append(exp_data[\"average\"][-1])\n",
    "_load_data(file_name)\n",
    "\n",
    "exp_data = pd.DataFrame(exp_data)\n",
    "exp_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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bq2cOXPq+vXr6ty5s3LkyKGnn37a2ubYsWPq1q2bmjRpotDQUJUvX16ffPKJJCk2Nla9evXSH3/8IUnq37+/IiMjNXXqVO3atUujR49WhQoVNGbMGH3zzTcqWbKk8ufPr++//16S9NNPP6lJkyaqV6+eypQpo3Llymn69OkOMR8/flzjxo1TqVKl9P7770uSjh49qo8//lh16tRRtmzZdP36dU2ZMkXPPfec8ubNq/r16+vvv/9O9Pp//PFHtW7dWvXr11f+/PlVv359/fzzz4nW27lzp1q0aKGqVauqWrVq6t69u65evZr2A4BkTZjwv+5z586d09tvv63w8HCNGTPGWvbll1+qSZMmypUrlw4ePKi5c+eqS5cuCg4O1iOPPKK9e/cmqvf333/X888/r0aNGikkJETVq1e37kyfOXNGPXv2tPrUt2nTRpGRkZowYYIqVKhg9Xlfv369pFvt8eGHH060fMOGDerfv7+KFSumMWPGKCoqSgMGDFB4eLiCg4OtLh+3i4mJ0ahRo9S8eXOVL19eRYoU0ahRoxQXF+ew3s2bNzVhwgRVrlxZjz76qPVrLdKuVKlSkqSuXbvqww8/TFRep04d6/8vXryo+fPnq0mTJmrYsKEuXryozp07KzAwUEFBQerVq5euX7/usH1KznHSre5FM2fOVP369VWnTh0VL15cXbt21enTpx3WS2mbQfqhzcDdaFPuUb58eUmyxgJv2rRJe/bs0YwZM3Tjxg3FxMRYfzdv3szIUNOMZO4+tmvXLp0/f17SrZND4cKFtWbNGkVHR2vMmDF67rnnFBkZaTXyv/76S02bNlWfPn20cuVKHTx4UBUqVNBzzz2nefPmyc/PT++//746deokSZoyZYrWr19vjdO7dOmSdu7cqa1bt2rnzp3q06eP8ubNqxs3bmjPnj2qW7euypQpo2+//VZ79uxR2bJl1adPH3377beSpPj4eH399ddavny5lTBKUuHChfXcc8/p1KlTun79usaPH6+OHTvq448/1pdffqlvv/1Wffv2dXjtS5cu1bBhwzRz5kytXbtWe/bs0enTp1WnTh2HgcXff/+9qlevrsaNGysqKko//vijgoKCnCZ9cJ81a9Y4HOPly5fr22+/1fbt261xikFBQXriiSdkjNGVK1f05ptvqnHjxpo3b55++OEHbd++PdEvmFFRUerQoYNef/11rV69Wvv371eOHDnUuHFjrVmzRvny5dPixYvVuHFjSdKnn36q9evXa8iQIdqxY0ei2VMLFiyoXbt2JdpPnTp1VL16df31119auXKlTp8+rcmTJ+vnn39WuXLl1KtXL4d2duPGDTVu3FilS5fW119/rZ07d2r48OF69dVX1aVLF2u9hIQEPfXUU/rkk0+0fPlybdy4UZ988on1wwbSpmvXripfvryuXr2qjh07qnbt2tq8ebNV/uSTT1rjVE6fPi1/f3+tWrVKly9f1ssvv6y2bdtqyZIlKlu2rGbMmOFwVzkl5zjp1heoNm3aaPXq1Vq2bJk2bNigGTNmaO7cuWrQoIHV/lPaZpC+aDNwN9qUe3Tq1EleXl764IMPNHfuXF25ckWLFi1SYGCg5syZo+zZs8vf318dO3Z0eO2eiGTuPnL7Lw+7d+9W27ZtJUlt27ZVhw4dVKNGDZUuXVqS1Lp1azVo0EBff/21vvrqK0lS79691blzZ+sk4uPjo8GDB0uS/v3v5AeUV65cWU2bNrW2e/nll9WnTx/99ttvql+/vlavXq3r169b/ZBtNpueffZZSf8bCO3t7a1u3brpueeec7oP+9iqkSNHKnfu3JKkRx99VLly5XL4oF6/fl0vvPCC3nzzTeXJk8fatmvXrrp27Zr+85//SLrVZbRt27aqV6+eevbsacU1ZswYh3FcSLsFCxYoMjJSkZGRCg8PV+PGjZWQkGCVP//883rxxRedbms/FvbZpiSpWLFiKlu2rKKiohxmHe3SpYuGDx+uwoULS5KyZ8+ufv36KSEhIUVT+oeFhTldXqxYsSTjatCggdWtw2azqWnTpkpISHAYgD1t2jQFBASoTZs21rJu3bopT548WrBggfbt22ett2zZMr333nsKDg629m3/HCJtsmfPrg0bNljnxo0bN6pWrVpq0qSJfv31V4d1S5YsqWeeeUbSrW48b7zxhho2bKjIyEitXLlSRYoU0ZdffqkffvhBklJ0jpOkOXPmaMmSJZo1a5b8/f0lSY899pgKFiyov/76y+o6lNI2g/RFm4G70abS7uzZs5o6dary5cun8+fP66233lLdunWt8l69eql48eJq166dFi1aZP2A66no2HwfWbt2rZ555hmdOnVKp0+fVlhYmIYMGeJwt8E+vq5SpUoO2168eFErV67U0aNHreRO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AQNUpUoVXblyRY0bN1ZwcLDy5s2r5s2ba8qUKdb4yJS2maRcu3bNeo179uxJwzsG2swtu3btkiSHH3vhGtrULalpUw0bNrTGw3fu3Nlhkrrly5ercuXK2rNnj0qWLKnjx4+radOmyps3rwoUKKDFixc7zHbpTFxcnBWHs1jt32f++OOPRIm4vezs2bMODzF3F5K5f7BJkyapZMmSWrZsmSRp5cqVKlGihNMp2Ddu3KgHH3zQ+uLZsGFDdevWzWGdcuXKaevWrXrqqacUEBCg8+fPq1q1atq0aZM1gFaSnn32WdWvX1+vvPKKXnrpJT3yyCNq3769evToIenWbJIlSpRwmAZ38uTJioyM1Ndff62uXbvK399fX375pQoXLqzdu3crJCREoaGhql+/viZOnCjp1i9X9evX17Zt2/TQQw9ZX5IjIiL0n//8Rx9//LHKli1r3TqvUaOGdQJ8/vnntWrVKtWoUUM+Pj66cuWK2rdvrxUrVlh3ZWw2mxYtWqSRI0dq9erVKlmypJ5//nl98803CgsLU3h4uD799FOHky1Sxt427b8Srly5UiEhIUlOsd+xY0drMPNHH32k8PBwHT58WGXKlLGSmqeeekp9+vTRunXrVLp0aSvhfuqpp/Tqq69KkurVq6dNmzapYcOGypYtmy5cuKAmTZpow4YN1pgCSerevbuqVKmizp07a/To0apVq5YkqUKFCpo1a5bOnj2r5s2ba9asWRo2bJiqVKmicuXKKW/evAoMDFT37t310ksvOcT7999/q06dOho9erQkaeHChapSpYri4+OVPXt2ff/99+rXr59CQkJ05coV5c+fX0uXLnWYcCgiIkIbN25UxYoVVbduXTVr1kw9e/ZU0aJFFRQUJG9vb3366aeMq0ujb775RiVKlFCpUqUUERGhihUr6q+//tLPP/9sJfS3e+SRR7R+/XpFRESoSpUqmjJlitauXWvNGCel/Bzn7++vdevWqW/fvipQoIAuXLigcuXK6bvvvlO1atWs+lLaZpx57rnnVKxYMetLxcCBA1WmTBnr4bpIvfu5zUyaNEklSpTQ0qVLJd1KIgoVKqTXX3/dHW/tfYs2lbo25efnp++//14DBgzQ33//rYceekgtW7bUyJEjFRYWprZt26pgwYKKiopS3759lT9/fsXHx6tevXpasmRJshOJDRw4UMWLF7cm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e+vbb791WhYZGSlvb29VrFhRderUUWRkpHUurVChgiIjI1WrVi0VKFBANptNU6ZMceOrS5mUXC/27t2rHj16OJxTW7durTVr1iSq76+//lK3bt3k5eUlLy8vdenSRUePHlXNmjXl7+9vbe/n56eqVavq0KFDkqQjR46oSpUq1rnJvs4jjzyiXr16qWDBgtbyatWq6fr1605fz9ChQxUaGmqtW65cOX388cfp+h664tKlS5o5c6bq1q2riIgIRUZGqkmTJmrWrJkmTZqkXbt26aWXXpJ06z212WwKDAy01q1evbr1HkVGRioyMlJVq1aVn5+fbDabwzU0pefsX3/9VRMmTFBwcLBsNpt8fHxUtGhRlS1bVvnz59dDDz2kLl26aNeuXYlez/fff6+RI0cqR44cstlsyp49u8qVK6fHHntM4eHhCgsLU+PGjTV37lzFxsam+/ublLfeekuFChWy2keJEiUUHx9/1+0uXLiggIAA63tQ7ty5Vbx4cYdzfVLXzalTp6pkyZLWug8++KAmT57s9muGJ5xvUmvjxo0aPXq0cubMab1HefLkUbly5VS6dGmFhoaqRo0a6tevn7Zu3eqwraufm0WLFqlbt24Ox6VgwYIqX768SpQooWLFiqlBgwYaM2aMjhw5kkHvTCZj4FbXr183VatWNXXr1jVnz561lm/ZssWUKlXKSDK7du2ylnft2tVIMg899JC5fv16kvUeP37c+Pj4mDlz5ljLbty4YQYPHmwkGUmmT58+SW5/7do1U6BAATNp0iSH5bNmzTL9+vUzW7ZsMevWrTONGzc2kkyjRo0S1fHtt9+a7Nmzm6+++spa9sEHHxhvb28zd+5ch3WHDx9uJJmCBQuahx56yOHP39/fdOnSJclY77W5c+eabNmymSeffNL88ccfDmU///yziYyMNJLMqFGjkqxjx44dRpJ58cUXU7RP+/t8+/E8fvy4ad68uZFkChUqZI4dO5Zouz/++MMEBQWZAQMGmBs3bhhjjImLizMLFy40AQEBJigoKEX7T4vu3bsbSWb48OHWsgsXLpguXboYSSYwMND8+uuvibbr27dvou1ut3PnThMREeGwbPHixSZLlixm0aJF1rLLly+b4cOHG5vNZp566imH9RMSEkyLFi2MJNOwYUOTkJCQqKxs2bLm8OHD1vLffvvNREREGElm2bJlieI6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bJiRbk0Ed/vYuatXr5p8+fJZ7a1mzZpGUqLz9e1tLSEhwbRv395IMv7+/ubHH390us87Y3HHNcOZzHa+cVVKxrwbY8zXX39tvU9btmxJVJ6az01K3zv7xD5+fn53rfOfijtz6SAwMFAff/yxNm3aZP2atGrVKoWHh+vll19O0TS8adn3qlWrVLhwYe3bt08tW7ZM0TTEzz//vN555x11795dxhhNnDhRc+fOdVhn7ty5WrBggS5fvqxatWqpffv2Wrp0qdVFytm08rdbuHBhprgrJ8lh2uhs2bK5VMelS5e0evVqh9dUunRpPfHEEzpy5IjTXxnv1KlTJ/3www9q3769JOmHH35QoUKFkt2mTJky+umnn/Thhx+qWLFiunHjhmbOnKmSJUvqo48+cum1uKJx48batGmT9Uvo5s2bk+xee7sOHTpo/fr11t+ff/6pDz74IMn1W7ZsqX379mnUqFHKmTOnzp07p0GDBqlcuXL65ZdfUhWzn5+fpk6dql9//VWPP/64JOnHH39U3bp11b59e4fp1u1tJLXtwxijf/3rXxo5cqTTMaZ3U7VqVX333Xdq3Lix/v7771T/Am/XoEEDh/f5999/17p169I0jsneZcY+bud2M2fOVFxcnKpVq+awPHv27Grbtq3i4uISnVNcObbx8fF69913rW5+khQUFKRu3brp6tWreuedd1x+fRnBletF3rx5rcfYTJgwwVq+bt06BQUFpWjs7LfffuvQPux/ST3mwZksWbLoyy+/VMWKFXXmzBk1adLE6pKf2dx+zr+zF8Dt1qxZo3feeUeHDx/W4cOHNWbMmFT3tLiTq+fsihUrauPGjVb3wR9//FHBwcEp2udLL72krVu3avPmzTp8+LB+++03vfTSS9q5c6dGjx5t3aHPDAYMGKAcOXLojz/+sHpESNKsWbNUunRp685LSthsNs2bN0+NGjWyein9+eefLseWmmsGHMe5paaLpTv2ea/2lxmRzKWjmjVrauPGjVq1apUqV66shIQEvfnmmw7dG+42wPN2CQkJ1oQpySlYsKBWrVql3Llza/PmzXr++edljEl2m6xZs6pSpUqaOXOmNYGHszEc7du31+rVq7Vz504rOdu0aZMkJfuMswMHDigqKipR982MEhISYv3/6dOnXapjxowZunr1qurXr289LyUyMtJ6btOkSZNSXNe0adNUvHhxrV+/Xq+99tpd1/fy8lKHDh30xx9/aObMmXrggQd0+fJltW/fPtH4pPQ2YsQIRUREaO/evU4nEUmJ559/Ptlxizly5NDo0aN16NAhDRo0SFmzZtWBAwdUr169ROOtUqJcuXJaunSpdVGWpI8++sjhGXD2NpLa9vHFF19o6dKl6tGjh0qVKmX91atXT5L05ZdfqlSpUho6dGiSdfj5+WnevHnKnj27W7uv1a1b1+oy7W72cbp+fn6JyqpUqSLp1njcO6X22C5evFhnz57VE0884fC527Rpk7y8vDR9+nTFxMS4+dWlv5RcL243cOBA+fj46PPPP7e61L/11lvWs9HulVy5cmnFihUqWrRoqn5AvNeKFCli/f/dhiA0bNjQ+v8aNWq4Zf9pOWd37NhRzzzzjE6fPq0OHTok+UzZ5JQqVUqTJ0/WuHHjtGbNGtWoUSPRM0EzSlBQkNV1eOzYsUpISFBMTIwmTZrk0tABX19fffbZZ6pSpYpOnz6tpk2bpvlHhpRcM/C/eRVsNptCQ0Pv6T6LFi16T/aXGZHMudn48eMTTVzQqFEjRUVF6eWXX5Ykvf3229bFLkeOHJKUoskOrly5kuKH/ZYpU0bLli1T1qxZtXjxYg0ZMiTFr6Fbt27Kmzdvir7E/uc//9H169dVpUqVZAdkL1y4UPXr19cDDzyQ4jjSU2hoqMLCwiRJUVFRqd4+JiZGCxcu1I4dOxL9sr19+3ZVrFhRu3btcvpAdWdy5syphQsXytvbW6+99prDhBK3u/OLna+vr7p3764//vjD+vXyjTfeSPXrSQtvb28tWLBAOXLk0Pvvv+/yA4KdzbB45+sNCgrSxIkTtX37doWEhOjChQuJ7vYkZeHChYl+ja5WrZrWrVtnDZZfvHix9RDSxx57TNKtsW93Gw96uytXruj69ev6448/HP7svw5fvnxZf/zxh06ePJlsPcHBwYqIiFDWrFlTvO+UsE844G7Xrl2T5HyWPXuifvtMZa4e28mTJ2vLli2JPnc//fSTWrRoodOnT2v+/PnufGnpJrXXi9uFhoaqTZs2io+P18SJE7V//37t379fzZo1uyex3y44OFirV69W3rx5tWnTJnXs2PGuPyDeayEhIVbvkc8//zzZdW8f45rceNeUcNc5e/bs2SpYsKC+/fZbjRs3zuV4evXqpaxZs+rSpUtpvuPoTgMHDlT27Nm1d+9effrpp5ozZ47CwsKsH8FSK0eOHFq+fLnCwsL0xx9/qFWrVqn+kSG11wzIurNfpUoV5c2bN933Fx8fr/Xr10uSmjRpku77y6xI5twsLi7O6SBMLy8vTZw4UUWLFtX169etLh/2XwudTX17uzNnziggICBVXb5q1qypTz75RN7e3po0aVKKkxYfHx8VK1bsrrPJ/frrr3rrrbeUJ08eLVq0KNmB4pmpi6Wd/Rfs//73v9YX0eTY70BK0vz589WyZcskZ6Oyf2F2Nl16UiIiIjR8+HDFx8erXbt2ThOIX375xenyXLlyad68eZJ01yQhPYSFhVl3dLt37679+/e7XNeyZcus/1+zZo3TdUqXLq2xY8dKSt3rTaq+vn37WpMi2Ot79tlnVahQIcXHx2vBggV3rfvKlSvasWOHOnXqJHPrGZ4Of/Y7tvYvuu+///5d6/Tz87OSSnf75ptvFBsba3W7TOuXb/sdP2d3Eu1dkW6/y+HKsV25cqVKlCihggULOt3W/rl7880307U7u7uk9npxpyFDhshms+mDDz7QsGHD1Ldv3wybKbhkyZL6+uuvlS1bNi1atEifffZZhsSRHPvETFFRUfdsan53nbNz586tDz74QDabTaNHj3a4HqVGlixZlDNnTknS1atXXaojPeTLl089evSQJL322muaOHFimif0yp8/v1avXq38+fNr48aNKXps0J1Sc8243+3fv9/6oeSVV165J/tcsGCBTpw4IX9//wx/5E5GIplLB+PHj3f67CSbzSZvb2+VKFHCmmmsUqVKKlOmjH7//Xft27cvyTqnTp2qNm3aOC2Li4tzuj9JatWqlTWGJCUJi3TrBL9///5kf8E/dOiQmjZtKn9/f3322WcqXrx4kutu2bJFf//9t1q1apWi/d8rPXr0UMOGDXXy5En1798/2S+za9assS7IMTExGj9+vHXhcaZ169bKlSuX1q9fbz2y4Xb243XnF85///vfqlatmo4dO6Znn3020XG9efOm0xnspP/9gnzn7ITullTsnTt31lNPPaUrV66oVatWie44pCRZOHDggFatWmX9+5dffrEeD3CnpF6vPT5nXZGmTZuWaDbW2+sLCAjQww8/LOlWIvXBBx8oS5YsGjVqlPbu3Ztk3LGxsRo/fnyKZr1MqTNnzujs2bOpfhZRSt7n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",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "matplotlib.rcParams[\"font.size\"] = 16\n",
    "\n",
    "# plot bar chart of `exp_data`:\n",
    "# exp_name\texp_class\tsvhn\tstanford_cars\tresisc45\teurosat\tgtsrb\tmnist\tdtd\tsun397\taverage\n",
    "# 0\tclip-vit-base-patch32_sun397\tFinetuned\t0.282691\t0.469593\t0.543175\t0.464815\t0.264291\t0.4433\t0.416489\t0.749673\t45.425332\n",
    "# 1\tprojection_merging_low_sun397\tLow\t0.325330\t0.555777\t0.588571\t0.570370\t0.275693\t0.4882\t0.408511\t0.626801\t47.990666\n",
    "# ...\n",
    "fig, ax = plt.subplots(figsize=(10, 4))\n",
    "plot_data = exp_data[exp_data[\"exp_class\"] != \"Pretrained\"][\n",
    "    [\"task\", \"task_accuracy\", \"exp_class\"]\n",
    "]\n",
    "_pretrained_data = defaultdict(list)\n",
    "for task in [\n",
    "    \"sun397\",\n",
    "    \"stanford-cars\",\n",
    "    \"resisc45\",\n",
    "    \"eurosat\",\n",
    "    \"svhn\",\n",
    "    \"gtsrb\",\n",
    "    \"mnist\",\n",
    "    \"dtd\",\n",
    "]:\n",
    "    # append plot_data from the row 'Pretrained'\n",
    "    _pretrained_data[\"task\"].append(task)\n",
    "    task = task.replace(\"-\", \"_\")\n",
    "    _pretrained_data[\"task_accuracy\"].append(\n",
    "        exp_data[exp_data[\"exp_class\"] == \"Pretrained\"][task].values[0]\n",
    "    )\n",
    "    _pretrained_data[\"exp_class\"].append(\"Pretrained\")\n",
    "plot_data = pd.concat([pd.DataFrame(_pretrained_data), plot_data], ignore_index=True)\n",
    "\n",
    "sns.barplot(\n",
    "    x=\"task\",\n",
    "    y=\"task_accuracy\",\n",
    "    hue=\"exp_class\",\n",
    "    data=plot_data,\n",
    "    ax=ax,\n",
    "    # 颜色\n",
    "    palette=[\"#7EA6E0\", \"#97D077\", \"#EA6B66\", \"#FFB570\", \"#CCCCCC\"],\n",
    ")\n",
    "ax.legend(\n",
    "    title=\"\",\n",
    "    loc=\"upper center\",\n",
    "    bbox_to_anchor=(0.5, 1.2),\n",
    "    ncol=5,\n",
    "    columnspacing=0.6,\n",
    ")\n",
    "\n",
    "# the xlabels to upper cases\n",
    "ax.set_xticklabels(\n",
    "    [\n",
    "        x.get_text()\n",
    "        .upper()\n",
    "        .replace(\"STANFORD-CARS\", \"CARS\")\n",
    "        .replace(\"EUROSAT\", \"EuroSAT\")\n",
    "        for x in ax.get_xticklabels()\n",
    "    ]\n",
    ")\n",
    "ax.set_ylabel(\"Accuracy\")\n",
    "ax.set_xlabel(\"\")\n",
    "ax.set_ylim((0.25, ax.get_ylim()[1]))\n",
    "plt.savefig(\"single_task.pdf\", bbox_inches=\"tight\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
